// Typescript类型、接口、类、泛型

/**
 * 定义一个操作数据库的
 * 要求1：Mysql MsSql MongoDb功能一样
 * 都有add update delete get方法
 * 注意：约束统一的规范、以及代码重用
 * 解决方案：需要约束规范所有要定义接口，需要代码重用所以用到泛型
 *  1. 接口：在面向对象的编程中，接口时一种规范的定义，它定义了行为和动作的规范
 *  2. 泛型：泛型就是解决类、接口、方法的复用性
 */ 
interface DBI<T> {
  add(info: T):boolean;
  update(info: T, id: number): boolean;
  delete(id: number): boolean;
  get(id: number): any[];
}

// 定义一个操作mysql数据库的类
// 注意：要实现泛型接口，这个类也应该时一个泛型类
class MysqlDb<T> implements DBI<T>{
  constructor () {
    console.log('数据库建立连接')
  }
  add(info: T): boolean {
    console.log(info)
    return true
  }
  update(info: T, id: number): boolean {
    return true
  }
  delete(id: number): boolean {
    return true
  }
  get(id: number): any[] {
    var list = [
      {
        title: '11',
        desc: 'xxxx111'
      },
      {
        title: '22',
        desc: 'fsdas222'
      },
      {
        title: '33',
        desc: '333fs'
      }
    ]
    return list
  }
}

// 定义一个操作MsSql数据库的类
class MsSqlDb<T> implements DBI<T> {
  constructor () {
    console.log('数据库建立连接')
  }
  add(info: T): boolean {
    console.log(info)
    return true
  }
  update(info: T, id: number): boolean {
    return true
  }
  delete(id: number): boolean {
    return true
  }
  get(id: number): any {
    var list = [
      {
        title: '11',
        desc: 'xxxx111'
      },
      {
        title: '22',
        desc: 'fsdas222'
      },
      {
        title: '33',
        desc: '333fs'
      }
    ]
    return list[id]
  }
}

// 操作用户表，定义一个User类和数据表做映射
class User{
  username: string | undefined;
  password: string | undefined;
}
var u = new User()
u.username = '张三'
u.password = '1234456'

// 类作为参数来约束数据传入类型
// var oMysql = new MysqlDb<User>()
var oMssql = new MsSqlDb<User>()
// oMysql.add(u)
oMssql.add(u)

// 获取User表ID = 2的数据
var data = oMssql.get(2)
console.log('dd', data)

export {}